package com.atguigu.study.bootredis.jdk8;

import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author jiangta
 * @version 1.0
 * @date 2021/1/5 5:06 下午
 */
public class LambdaTest {

    public static void main(String[] args) {
        List<Apple> appleList = new ArrayList<>();//存放apple对象集合

        Apple apple1 =  new Apple(1,"苹果1",new BigDecimal("3.25"),10);
        Apple apple12 = new Apple(1,"苹果2",new BigDecimal("1.35"),20);
        Apple apple2 =  new Apple(2,"香蕉",new BigDecimal("2.89"),30);
        Apple apple3 =  new Apple(3,"荔枝",new BigDecimal("9.99"),40);

        appleList.add(apple1);
        appleList.add(apple12);
        appleList.add(apple2);
        appleList.add(apple3);

        Map<Integer, List<Apple>> groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));
        System.err.println("groupBy:"+groupBy);

        /**
         * List -> Map
         * 需要注意的是：
         * toMap 如果集合对象有重复的key，会报错Duplicate key ....
         *  apple1,apple12的id都为1。
         *  可以用 (k1,k2)->k1 来设置，如果有重复的key,则保留key1,舍弃key2
         */
        Map<Integer, Apple> appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a, (k1, k2) -> k1));
        System.err.println("groupBy:"+appleMap);

        List<Apple> filterList = appleList.stream().filter(a -> {
            return "香蕉".equals(a.getName());
        }).collect(Collectors.toList());
        System.err.println("groupBy:"+filterList);

        //计算 总金额
        BigDecimal sum = appleList.stream().map(Apple::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        System.out.println(sum);

        Optional<Apple> maxApple = appleList.stream().max(Comparator.comparing(Apple::getMoney));
        System.out.println("max apple" + maxApple.get());

        Optional<Apple> min = appleList.stream().min(Comparator.comparing(Apple::getMoney));
        System.out.println("min apple" + min.get());

        //去重
        ArrayList<Apple> unique = appleList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(
                Comparator.comparingLong(Apple::getId)
        )), ArrayList::new));
        System.out.println("去重后：" + unique);

        //将list转换为map
        Map<Integer, Apple> appleMap1 = appleList.stream().collect(Collectors.toMap(Apple::getId, Function.identity()));
        System.out.println(appleMap1);
    }
}
